<?php
require_once 'handlers/user/_BaseAuthHandler.php';
/**
 * Хендлер создания нового пользователя с привязкой к компании
 **/ 
class AddNewUserToCompany extends BaseAuthHandler{


  protected
    $companyObj = false,
    $action = false,
    $email = false,
    $password = false,
    $firstName = false,
    $lastName = false,
    $position = false,
    $status = 1,
    $setRoles= array(2);

	public function setParams($params){  
    if (isset($params['action']) && !empty($params['action'])) $this->action = $params['action'];
    if (isset($params['setRoles']) && !empty($params['setRoles'])) $this->setRoles = $params['setRoles'];
    if (isset($params['status']) && $params['status']>0) $this->status = $params['status'];
    if (isset($params['email']) && !empty($params['email'])
        && preg_match('/[a-z0-9_.-]+@[a-z0-9_.-]+\.[a-z]{2,9}/i', $params['email'])) $this->email = $params['email'];
    if (isset($params['password']) && !empty($params['password'])) $this->password = $params['password'];
    if (isset($params['firstName']) && !empty($params['firstName'])) $this->firstName = trim($params['firstName']);
    if (isset($params['lastName']) && !empty($params['lastName'])) $this->lastName = trim($params['lastName']);
    if (isset($params['position']) && !empty($params['position'])) $this->position = trim($params['position']);
    if (isset($params['companyObj']) && isset($params['companyObj']->data['company_id']))
        $this->companyObj = $params['companyObj'];
	}

	public function process(){
    $isError = false;
    if ($this->action!='reg_user_add') {
      return FALSE; //nothing to do
    }

    if (!isset($this->companyObj->data['company_id'])) {
      $isError = WallrideError::add('noCompanyDefined', 'wrong object passed!', 'AddNewUserToCompany');
      Logger::error('could not read company_id'.var_export($this, true));
      return false;
    }
    if (!$this->email){
      $isError = WallrideError::add('invalidEmail', 'Неправильно введён e-mail', 'AddNewUserToCompany');
    }
    if (!$this->firstName){
      $isError = WallrideError::add('emptyName', 'Имя должно быть заполнено', 'AddNewUserToCompany');
    }
    if (!$this->lastName){
      $isError = WallrideError::add('emptyName', 'Фамилия должна быть заполнена', 'AddNewUserToCompany');
    }
    // Если не указан пароль, генерим случайный
    if (!$this->password) $this->password = $this->generateUserPassword();

    if (!$this->isPasswordValid($this->password)){
      $isError = WallrideError::add('invalidPassword', 'Пароль должен быть не короче 6 символов. Желательно использовать английские буквы и цифры', 'AddNewUserToCompany');
    }

    require_once 'models/user/user.php';
    //Ищем, не зарегистрирован ли уже этот пользователь в компании
    $existingUser = UserModel::getByEmailAndCompanyId($this->email, $this->companyObj->data['company_id']);
    if ($existingUser){
      $isError = WallrideError::add('invalidEmail', 'Такой е-мейл уже зарегистрирован', 'AddNewUserToCompany');
    }

    // Набрали ошибок, пользователя не создаём.
    if ($isError) return false;

    // Создаём пользователя
    $user = UserModel::create(array(
      'company_id'=>$this->companyObj->data['company_id'],
      'status_id'=>$this->status,
      'display_name'=>trim($this->firstName.' '.$this->lastName),
      'position_name'=>$this->position,
    ));
    if (empty($user->data['user_id'])){
      $isError = WallrideError::add('userCreateFailed', 'Не удалось создать пользователя. Обратитесь, пожалуйста, к администратору.', 'AddNewUserToCompany');
      Logger::error('could not create user!'.var_export($this, true));
      return false;
    }

    // Создаём авторизацию
    require_once 'models/user/user_auth.php';
    $userAuth = UserAuthModel::create(array(
       'user_id'=>$user->data['user_id'],
       'auth_type'=>'email',
       'key1'=>$this->email,
       'key2'=>$this->getEncodedPassword(),
    ));
    if (!$userAuth){
      $isError = WallrideError::add('userCreateFailed', 'Не удалось создать авторизацию пользователя. Обратитесь, пожалуйста, к администратору.', 'AddNewUserToCompany');
      Logger::error('could not create authorization for user!'.var_export($this, true));
      return false;
    }


    // Создаём профиль
    require_once 'models/user/user_profile.php';
    $userProfile = UserProfileModel::create(array(
       'user_id'=>$user->data['user_id'],
       'first_name'=>$this->firstName,
       'last_name'=>$this->lastName,
    ));
    if (!$userProfile){
      $isError = WallrideError::add('userCreateFailed', 'Не удалось создать профиль пользователя. Обратитесь, пожалуйста, к администратору.', 'AddNewUserToCompany');
      Logger::error('could not create authorization for user!'.var_export($this, true));
      return false;
    }

    // Назначаем роль
    foreach($this->setRoles as $roleId){
      $res = $user->setRoleById($roleId);
      if (!res){
        $isError = WallrideError::add('userCreateFailed', 'Не удалось назначить роль пользователя. Обратитесь, пожалуйста, к администратору.', 'AddNewUserToCompany');
        Logger::error('could not attach a role (id='.$roleId.') for user!'.var_export($this, true));
      }
    }

    if ($isError) return false;

    require_once 'libraries/quickmail.php';
    $companyName = $this->companyObj->data['name'];
    QuickMail::send($this->email, 'Добро пожаловать в Мотиватор!',
        "Вас приветствует Мотиватор!\n
         Вы зарегистрированы в системе, в компании {$companyName}.\n
         Для входа используйте свой е-мейл и пароль: {$this->password}\n
        ");
    
    return true; //Слава Алаху! Всё без ошибок! :)
	}


}
?>
